我們在舉辦【Python 大數據培訓課程】時,發現很多學員對 Selenium 有以下問題,在此解釋一下:
網絡爬蟲是什麼?
我們每天花很多時間在網絡,例如投資股票的朋友每天不時上網留意股價,廣告界的朋友經常在社交媒體、論壇等地方收集最新資訊,房地產的朋友則經常留意各區物業買賣價等。不論目的為何,大家做的其實都是不斷重複三個步驟 ─「打開網頁」、「前往目標版面」、「記錄資料」。其實只要你懂寫簡單的電腦程式,便可把這些重複動作交給電腦自動去做,電腦可以 24×7 無間斷地,每隔一個指定的時間 (例如每隔 5 分鐘),自動地去做記錄資料的工作。你更可以指示電腦自動分析這些資料,並自動執行某個行動 (例如股價波動到某個位時自動進行交易)。
Selenium 原理是什麼?
Selenium 是利用自動化控制你的瀏覽器,前往網站,模擬人手點擊鍵盤滑鼠下載資料的,就像網絡版的按鍵精靈。這個方法雖然簡單原始,但卻是最通用而有效的方案,99% 以上的網站都可以下載到。
原因是,瀏覽器是必定可以運行所有 Javascript、frame 的 (不然你平日怎樣上網?)。其次,無論網站採取那種技術去阻擋爬蟲程式,它的設計是一定要讓正常用戶通過 (不然這個網站就無人去到了…)。而正常用戶是通過瀏覽器觀看網站的,而且他們是用鍵盤和滑鼠操作網站的。
Selenium 正是基於瀏覽器,並且會模擬鍵盤和滑鼠操作網站,只要目標頁面你平日能夠用瀏覽器入到,那 Selenium 都會入到的,因此幾乎所有網站都可以用 Selenium 爬的。
網絡爬蟲是否犯法?
Python Selenium 並不是 black magic,它無法神奇地取得對方的機密資料。它的原理只是自動化控制你的瀏覽器,前往網站,模擬人手點擊鍵盤滑鼠,copy-and-paste 取得資料。因此所取得的網站內容其實都是對方已經公開在網站上的,用人手都能拿到,所以並不犯法的。要注意的是如果你把程式速度設定過快,網站可能會認為你在惡意攻擊而把你封鎖 IP。因此我們會教你在程式加入適量延時,減慢程式速度以避免這點。
我曾試過用某個工具把網站的 HTML 下載,但裡面無我要的資料!?
這是因為該網站內容是動態地以 Javascript 呈現出來、又或是用 frame 包住的,因此雖然你在瀏覽器上看到,但你下載回來的HTML檔卻不會含有資料,這是網站阻擋爬蟲程式的常見做法。你一般會在這些網站源碼中看到 frame、iframe、document.write、ajax、XMLHttpRequest 等語句。要解決這個問題,你的爬蟲程式不能是單純的 HTML 下載器,而是要能夠運行 Javascript 和 frame 的程式,Selenium 正是解決這個問題的好方法。
Selenium、Beautiful soup、Scrapy 有什麼不同?
除了 Selenium 外,常見的爬蟲庫還有 Beautiful soup、Scrapy。但它們無法運行 Javascript 和frame,只能把網站的HTML源碼下載 (嚴格來說 Beautiful soup 只是 HTML 解析器,下載還需搭配urllib、requests 等工具庫)。因此很多動態生成資料的網站它們都無法下載。你可能會問,那為什麼這些庫還會存在?那是因為它們的設計目的不是讓你下載網站資料,而只是要快速取得網站內每個頁面所有的超連結 (a),分析網站頁面之間的關係 (好像 Google, Yahoo 等搜尋引擎)。這些庫不運行Javascript,大大提升了它們的速度,它們1秒內下載數十個頁面都不是難事 (但實際應用時還是要限速以避免封 IP)。
而 Selenium 的設計初衷則是讓網站開發人員為網站自動化除錯用的 (相信你曾經遇到過某些網站上的按鈕被廣告蓋住,無法點擊吧。那就是因為開發人員偷懶,無進行測試的結果!),小型網站只有數十個頁面,開發人員手動到訪每個頁面測試就可以了。但有數千個頁面的大型網站就必須要用 Selenium 自動測試所有頁面了。由於 Selenium 站在使用者角度測試網站,因此它必須模仿使用者瀏覽頁面時的行為,例如鍵盤輸入文字、滑鼠點擊、上下滑動頁面等。這個設計優點是能夠取得所有真實呈現在畫面的資料,絕大多數網站都能用,但缺點是速度較慢,1秒可能只能下載1頁。
Selenium 有無法下載的網站嗎?
只要是瀏覽器入到的網站,Selenium 都能入到,但網站的設計者還是可以透過一些技巧令你入到、看到,但下載不到資料。
首先是文字被嵌入在圖片中,這個情況下 Selenium 只能下載到圖片,但要讀取圖片中的文字(如下圖兩張圖片)則要用圖像文字識別 OCR (Optical Character Recognition) 技術才能讀到,大大增加讀取難度。
以上文字和走勢線是圖片畫出來的,程式需要加上 OCR (Optical Character Recognition) 才「可能」讀到。
然後是隨機出現的問答問題。除非你事先已為所有可能會出現的問題設定答案,否則Selenium基本上不可能自動答到的。
圖:隨機問答例子
除了以上兩種情況外,還有一些很奇特的方法令你看到但很難下載到資料的,但它們實行的成本都很高,也會影響到正常用戶訪問頁面的體驗,可謂殺敵八百自損三千,因此資料性的網站一般都不會特地用這些方法保護 (總不成要使用者每看一篇新聞都要答一次問題吧!) 因此只有一些非常大型、非資料性的網站才會使用。另外,即使網站用了問答或圖片驗証碼,只要出現頻率不高,Selenium 還是能夠下載到的,請見下文。
Selenium 對於有隨機問答、圖片驗証碼,或要登入的網站能否下載?
只要出現頻率不高,是可以的。雖然上面提及到 Selenium 很難自動完成問答,或讀到驗証碼內的文字,但你是可以做到先讓程式暫停在頁面,你手動輸入答案或驗証碼,再讓程式繼續運行的。因此大部份需要驗証碼登入的網站,你只需一開始手動輸入一次驗証碼,然後 Selenium 也是可以下載的。